/**
 * date : 2010-11-13 
 * author : Kim Jong-sun
 * comment : MemberController 구현
 *          MemberController 의 역할은 회원 관련 서비스를 제공하는데 있습니다.
 *          회원 가입 및 로그인 처리 역할
 */
package wetogether.member.control;

import java.sql.SQLException;
import java.util.ArrayList;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

import wetogether.member.service.MemberService;
import wetogether.member.vo.MemberVO;

public class MemberController extends MultiActionController {
	private Log log = LogFactory.getLog(getClass());	// log4j
	private MemberService memberService;				// DI를 위한 변수
	
	/*
	 * 객체 주입을 위한 setter
	 */
	public void setMemberService(MemberService memberService) {
		this.memberService = memberService;
		log.debug("MemberService injection...");
	}
	/*
	 * 회원 등록
	 */
	public ModelAndView registerMember(HttpServletRequest request, HttpServletResponse response) throws Exception {
		ModelAndView mav = new ModelAndView();
		MemberVO memberVO = new MemberVO();
		String viewName = "error";
		bind(request, memberVO);						// request의 form data 를 객체로 변환시키는 메서드
		
		try {
			memberService.registerMember(memberVO);		// registerMember 메서드 호출
			mav.addObject("memberVO", memberVO);		// memberVO 를 client로 전송
			viewName = "registerMemberResult";			// 정상 리턴될 viewName 설정
		} catch(SQLException sqlExp){
			log.error(sqlExp.getMessage());
		} catch(Exception exp){
			log.error(exp.getMessage());
		}
		mav.setViewName(viewName);						// 리턴될 viewName 설정
		System.out.println("registerMember : " + memberVO.toString());
		return mav;
	}

	/*
	 * 회원정보 보기
	 */
	public ModelAndView memberInfo(HttpServletRequest request, HttpServletResponse response) throws Exception {
		ModelAndView mav = new ModelAndView();
		String viewName = "error";
		MemberVO memberVO = null;
		String memberId = request.getParameter("memberId");
		try {
			memberVO = memberService.selectMemberInfo(memberId);
			mav.addObject("memberVO", memberVO);
			viewName = "memberInfo";
		} catch(SQLException sqlExp){
			log.error(sqlExp.getMessage());
		} catch(Exception exp){
			log.error(exp.getMessage());
		}
		mav.setViewName(viewName);
		System.out.println("memberInfo : " + memberVO.toString());
		return mav;
	}
	
	/*
	 * 회원 정보 수정
	 */
	public ModelAndView modifyMember(HttpServletRequest request, HttpServletResponse response) throws Exception {
		ModelAndView mav = new ModelAndView();
		MemberVO memberVO = new MemberVO();
		String viewName = "error";
		bind(request, memberVO);	// request의 form data 를 객체로 변환시키는 메서드

		try {
			memberVO = memberService.modifyMemberInfo(memberVO);
			viewName = "modifyMemberInfoResult";
			mav.addObject("memberVO", memberVO);
			
			HttpSession session = request.getSession();					// 세션설정
			session.setAttribute("memberVO", memberVO.getMemberId());	// 세션 다시 설정
		} catch(SQLException sqlExp){
			log.error(sqlExp.getMessage());
		} catch(Exception exp){
			log.error(exp.getMessage());
		}
		mav.setViewName(viewName);
		System.out.println("modifyMember : " + memberVO.toString());
		return mav;
	}
	
	/*
	 * 로그인
	 */
	public ModelAndView login(HttpServletRequest request, HttpServletResponse response) throws Exception {
		ModelAndView mav = new ModelAndView();
		MemberVO memberVO = new MemberVO();
		String viewName = "error";
		
		int locationId = 0;			// layout 에서 로그인시 locationId 를 저장하기 위한 변수
		bind(request, memberVO);	// request의 form data 를 객체로 변환시키는 메서드
		String saveLocation = request.getParameter("locationId");
		
		// java.lang.NumberFormatException 때문에 saveLocation 값이 null 이 아닐 경우에만 parseInt() 실행
		if(saveLocation != null){
			locationId = Integer.parseInt(saveLocation);
		}

		try {
			memberVO = memberService.login(memberVO);			//  login 메서드 호출
			if(memberVO != null){								// 로그인 성공
				HttpSession session = request.getSession();		// 세션설정
				session.setAttribute("memberId", memberVO.getMemberId());	// 세션 속성 설정
				session.setAttribute("isAdmin", memberVO.getIsAdmin());		// 세션 속성 설정
				// layout 에서 locationId를 잃어버리는 현상때문
				// locationId가 0이면 saveLocation 이 null
				if(locationId != 0){
					mav.addObject("locationId", locationId);
					viewName = "layoutLogin";
				}else{
					viewName = "mainLogin";	
				}
			}else{												
				// 리턴되는 memberVO가 null 일 경우 회원이 존재하지 않거나
				// 아이디 또는 비밀번호 오류
				// 위의 세가지 경우 하나로 처리
				mav.addObject("NotFoundMember", "회원을 찾을 수 없습니다");
				viewName = "loginFail";
			}
		} catch(SQLException sqlExp){
			log.error(sqlExp.getMessage());
		} catch(Exception exp){
			log.error(exp.getMessage());
		}
		mav.setViewName(viewName);
		System.out.println("login ok : viewName - " + viewName);
		return mav;
	}
	/*
	 * 로그아웃
	 */
	public ModelAndView logout(HttpServletRequest request, HttpServletResponse response) throws Exception {
		ModelAndView mav = new ModelAndView();
		String viewName = "error";
		String flag = request.getParameter("flag");
		
		HttpSession session = request.getSession(false);	// 요청으로부터 세션 가져오기
		if(session != null){								// 세션이 존재하면
			session.invalidate();							// 세션 종료
			// 로그아웃 위치
			if(flag == null){
				viewName = "mainlogout";	// viewName 설정
			}else{
				viewName = "layoutLogout";	// viewName 설정
				mav.addObject("locationId", request.getParameter("locationId"));	// locationId 를 다시 client 로 넘겨줘야함
			}
		}
		mav.setViewName(viewName);
		System.out.println("logout : viewName - " + viewName);
		return mav;
	}
	
	/*
	 * 아이디 체크
	 */
	public ModelAndView isExistMemberById(HttpServletRequest request, HttpServletResponse response) throws Exception {
		ModelAndView mav = new ModelAndView();
		String checkId = request.getParameter("checkId");
		String viewName = "error";
		String result = "ok";	// 사용가능 여부
		
		try {
			String flag = memberService.isExistMemberById(checkId);
			if(flag != null){		// 아이디가 존재
				result = "fail";	// 사용 불가능
			}
			mav.addObject("checkIdResult", result);	// 사용여부를 알려줌
			viewName = "checkId";
		} catch(SQLException sqlExp){
			log.error(sqlExp.getMessage());
		} catch(Exception exp){
			log.error(exp.getMessage());
		}
		mav.setViewName(viewName);
		System.out.println("isExistMemberById : " + result + ", ID : " + checkId);
		return mav;
	}
	
	/*
	 * checkPassword 로 기능 통합..
	 * 사용 안함
	 */
	/*public ModelAndView deleteMember(HttpServletRequest request, HttpServletResponse response) throws Exception {
		ModelAndView mav = new ModelAndView();
		MemberVO memberVO = new MemberVO();
		bind(request, memberVO);	// request의 form data 를 객체로 변환시키는 메서드
		String viewName = "member/deleteMember";
		
		try {
			memberService.deleteMember(memberVO);
			mav.addObject("memberId", memberVO.getMemberId());
			HttpSession session = request.getSession(false);	// 요청으로부터 세션 가져오기
			if(session != null){								// 세션이 존재하면
				session.invalidate();							// 세션 종료
			}
		} catch(SQLException sqlExp){
			log.error(sqlExp.getMessage());
			viewName = "member/error";
			mav.addObject("error_mess", "데이터베이스 오류");
		} catch(Exception exp){
			log.error(exp.getMessage());
			viewName = "member/error";
			mav.addObject("error_mess", "오류");
		}
		
		mav.setViewName(viewName);
		return mav;
	}*/
	
	/*
	 * 회원정보수정 및 탈퇴를 위한 비밀번호 체크
	 * 
	 * command에 따라 memberService 호출이 다름
	 * 
	 * command = modify -> 회원정보수정
	 * command = delete -> 회원 탙퇴
	 */
	public ModelAndView checkPassword(HttpServletRequest request, HttpServletResponse response) throws Exception {
		ModelAndView mav = new ModelAndView();
		MemberVO memberVO = new MemberVO();
		String resultFlag = null;
		String viewName = "error";

		String command = request.getParameter("command");	// 회원정보수정 or 탈퇴 확인을 위한 command
		bind(request, memberVO);
		
		try {
			resultFlag = memberService.checkPassword(memberVO);	// 비밀번호체크 수행 후 넘어오는 string 값으로 확인
			if(resultFlag != null){	// 비밀번호가 맞을 경우
				// 회원 정보 수정
				if(command.equals("modify")){
					memberVO = memberService.selectMemberInfo(memberVO.getMemberId());
					mav.addObject("memberVO", memberVO);
					viewName = "modifyMemberInfo";
				}
				// 회원 탈퇴
				if(command.equals("delete")){
					memberService.deleteMember(memberVO);
					HttpSession session = request.getSession(false);	// 요청으로부터 세션 가져오기
					if(session != null){								// 세션이 존재하면
						session.invalidate();							// 세션 종료
					}
					mav.addObject("memberId", memberVO.getMemberId());
					viewName = "deleteMember";
				}
			}else{
				viewName = "pwIncorrect";	// 비밀번호가 맞지 않을 경우
			}
		}catch(SQLException sqlExp){
			log.error(sqlExp.getMessage());
			viewName = "error";
		} catch(Exception exp){
			log.error(exp.getMessage());
			viewName = "error";
		}
		mav.setViewName(viewName);
		System.out.println("checkPassword : viewName - " + viewName + ", resultFlag - " + resultFlag);
		return mav;
	}
	
	/*
	 * 회원 목록보기
	 */
	public ModelAndView getAllMemberList(HttpServletRequest request, HttpServletResponse response) throws Exception {
		ModelAndView mav = new ModelAndView();
		String viewName = "error";
		ArrayList<MemberVO> memberList = null;
		String locationId = request.getParameter("locationId");
		try {
			memberList = memberService.selectAllMemberList();
			mav.addObject("memberList", memberList);
			mav.addObject("locationId", locationId);
			viewName = "getAllMemberList";
		} catch(SQLException sqlExp){
			log.error(sqlExp.getMessage());
		} catch(Exception exp){
			log.error(exp.getMessage());
		}
		mav.setViewName(viewName);
		System.out.println("getAllMemberList : " + memberList.toString());
		return mav;
	}
}